#include "glare.math.Vector3Utils.h"
#include "glare.math.Vector3.h"

namespace Glare {

	Vector3 Vector3Utils::calculateTangentSpaceVector(
		const Vector3& position1, const Vector3& position2, const Vector3& position3,
		Real u1, Real v1, Real u2, Real v2, Real u3, Real v3)
	{
		//side0 is the vector along one side of the triangle of vertices passed in, 
		//and side1 is the vector along another side. Taking the cross product of these returns the normal.
		Vector3 side0 = position1 - position2;
		Vector3 side1 = position3 - position1;
		//Calculate face normal
		Vector3 normal = side1.crossProduct(side0);
		normal.normalise();
		//Now we use a formula to calculate the tangent. 
		Real deltaV0 = v1 - v2;
		Real deltaV1 = v3 - v1;
		Vector3 tangent = deltaV1 * side0 - deltaV0 * side1;
		tangent.normalise();
		//Calculate binormal
		Real deltaU0 = u1 - u2;
		Real deltaU1 = u3 - u1;
		Vector3 binormal = deltaU1 * side0 - deltaU0 * side1;
		binormal.normalise();
		//Now, we take the cross product of the tangents to get a vector which 
		//should point in the same direction as our normal calculated above. 
		//If it points in the opposite direction (the dot product between the normals is less than zero), 
		//then we need to reverse the s and t tangents. 
		//This is because the triangle has been mirrored when going from tangent space to object space.
		//reverse tangents if necessary
		Vector3 tangentCross = tangent.crossProduct(binormal);
		if (tangentCross.dotProduct(normal) < 0.0f)
		{
			tangent = -tangent;
			binormal = -binormal;
		}

		return tangent;

	}
	//-----------------------------------------------------------------------
	Vector3 Vector3Utils::calculateBasicFaceNormalWithoutNormalize(const Vector3& v1, const Vector3& v2, const Vector3& v3)
	{
		Vector3 normal = (v2 - v1).crossProduct(v3 - v1);
		return normal;
	}
}
